#pragma once

#include <hiredis/hiredis.h>
#include <string>
#include <memory>
#include "../models/user.hpp"
#include <nlohmann/json.hpp>

/**
 * @brief Redis缓存管理类，使用单例模式
 * 
 * 该类负责处理与Redis的基础操作，包括：
 * - Redis连接管理
 * - 基础的键值操作
 * - 错误处理和日志记录
 */
class RedisManager {
public:
    /**
     * @brief 获取RedisManager单例实例
     * @return RedisManager& Redis管理器的单例引用
     */
    static RedisManager& getInstance();

    /**
     * @brief 初始化Redis连接
     * @return bool 连接是否成功
     */
    bool init();

    /**
     * @brief 清理Redis连接
     */
    void cleanup();

    // Basic Redis operations
    /**
     * @brief 设置键值对
     * @param key 键名
     * @param value 值
     * @param expirySeconds 过期时间（秒），0表示永不过期
     * @return bool 设置是否成功
     */
    bool set(const std::string& key, const std::string& value, int expirySeconds = 0);

    /**
     * @brief 获取键对应的值
     * @param key 键名
     * @return std::string 值，如果键不存在则返回空字符串
     */
    std::string get(const std::string& key);

    /**
     * @brief 删除键
     * @param key 键名
     * @return bool 删除是否成功
     */
    bool del(const std::string& key);

    /**
     * @brief 检查键是否存在
     * @param key 键名
     * @return bool 键是否存在
     */
    bool exists(const std::string& key);

    /**
     * @brief 设置用户会话
     * @param token 会话令牌
     * @param userId 用户ID
     * @return bool 设置是否成功
     */
    bool setUserSession(const std::string& token, int userId);

    /**
     * @brief 缓存用户数据
     * @param user 用户对象
     * @return bool 缓存是否成功
     */
    bool cacheUserData(const User& user);

    /**
     * @brief 移除用户会话
     * @param token 会话令牌
     * @return bool 移除是否成功
     */
    bool removeUserSession(const std::string& token);

private:
    // 私有构造函数，防止外部实例化
    RedisManager() = default;
    ~RedisManager();
    // 删除拷贝构造和赋值操作符，确保单例
    RedisManager(const RedisManager&) = delete;
    RedisManager& operator=(const RedisManager&) = delete;

    redisContext* context_ = nullptr;  ///< Redis连接上下文
    bool connected_ = false;           ///< 连接状态标志
}; 